package com.transaction.stockseata.interceptor;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.transaction.stockseata.annoation.RepeatSubmit;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.HashMap;

/**
 * @author ausu
 * @version 1.0
 * @description: 基于请求参数的校验
 *               1.这个拦截器是一个抽象类，将接口方法拦截下来，然后找到接口上的@RepeatSubmit注解；
 *               2.调用isRepeatSubmit方法去判断是否重复提交的数据，该方法在这里是一个抽象方法；
 *               3.我们需要再定义一个类继承自这个抽象类，在新的子类中，可以有不同的幂等性判断逻辑；
 *               example: 这里我们就是根据 URL地址 + 参数 来判断幂等性条件是否满足
 * @date 2023/1/29 20:11
 */
public abstract class RepeatSubmitInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod= (HandlerMethod) handler;
            Method method = handlerMethod.getMethod();
            RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class);
            if (annotation != null) {
                if (this.isRepeatSubmit(request,annotation)) {
                    HashMap<String, Object> map = new HashMap<>();
                    map.put("status",500);
                    map.put("msg", annotation.message());
                    response.setContentType("application/json;charset=utf-8");
                    response.getWriter().write(new ObjectMapper().writeValueAsString(map));
                    return false;
                }
            }
            return true;
        }else {
            return true;
        }
    }

    /**
     * 验证是否重复提交由子类实现具体的防重复提交的规则
     * @param request
     * @param annotation
     * @return
     */
    public abstract boolean isRepeatSubmit(HttpServletRequest request, RepeatSubmit annotation);

}
